package com.six.backend.dao;

import com.six.backend.pojo.*;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Mapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author : 张重阳
 * @date : 2021-11-26 14:38
 */

@Mapper
public interface ToolDao {

    /**
     * 查询工具列表
     * @param map {userName: 推送人姓名, conferenceName: 所属会议名称, agendaName: 所属议题名称}
     * @return List<Tool>
     */
    List<Tool> selectTools(Map map);

    /**
     * 查询所有工具列表
     * @param map {userName: 推送人姓名, conferenceName: 所属会议名称, agendaName: 所属议题名称}
     * @return List<Tool>
     */
    List<Tool> selectAllTools(Map map);

    /**
     * 查询德尔菲列表
     * @param toolId 工具编号
     * @return List<Delphi>
     */
    List<Delphi> selectDelphi(Integer toolId);
    /**
     * 插入问卷名称
     * @param questionnaire 问卷信息
     * @return 返回受影响的行数
     */
    Integer insertQuestionnaire(Questionnaire questionnaire);

    /**
     * 插入问卷问题
     * @param question 问题
     * @return 受影响的行数
     */
    Integer insertQuestion(Question question);

    /**
     * 插入问题的选项
     * @param answers 选项
     * @return 返回受影响的行数
     */
    Integer insertChoice(List<Choice> answers);

    /**
     * 获取问卷信息
     * @param name 问卷的名称
     * @return 问卷的集合
     */
    List<Questionnaire> getQuestionnaire(String name);

    /**
     * 获取正在使用该问卷的工具
     * @param questionnaireId
     * @return
     */
    List<Tool> selectUsingToolsByQuestionnaireId(Integer questionnaireId);

    /**
     * 插入问卷与问题的关系
     * @param relations 问卷与问题关系的集合
     */
    void insertQuestionRelations(List<QuestionnaireQuestionRelation> relations);

    /**
     * 查询问卷的所有题目
     * @param id 问卷的id
     * @return 题目的集合
     */
    List<Question> selectQuestionById(Integer id);

    /**
     * 删除问卷表里的信息
     * @param id 问卷的id
     * @return 返回受影响的行数
     */
    Integer deleteQuestionnaire(Integer id);

    /**
     * 删除问卷与问题联系表
     * @param id 问卷的id
     * @return 返回受影响的行数
     */
    Integer deleteRelation(Integer id);

    /**
     * 删除问题的选项
     * @param choices 问卷所有选项的数组
     * @return 返回受影响的行数
     */
    Integer deleteChoices(List<Integer> choices);

    /**
     * 删除问题
     * @param questions 问卷所有问题的数组
     * @return 返回受影响的行数
     */
    Integer deleteQuestion(List<Question> questions);

    /**
     * 查询所有题目的选项
     * @param questions 题目的集合
     * @return 选项的集合
     */
    List<Choice> selectChoices(List<Question> questions);

    /**
     * 查询单个题目的选项
     * @param id 问题的id
     * @return 单个题目选项的集合
     */
    List<Choice> selectChoice(Integer id);

    /**
     * 获取工具的人员列表
     * @param toolId 工具编号
     * @return
     */
    List<User> selectToolUserName(Integer toolId);

    /**
     * 通过德尔菲问卷编号获取用户账号
     * @param delphiId
     * @return
     */
    List<String> selectToolUserAccount(Integer delphiId);

    /**
     * 结束工具
     * @param toolId 工具编号
     * @return
     */
    Integer endTool(Integer toolId);

    /**
     * 结束工具(当结束最后一个问卷时调用)
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    Integer endToolByDelphiId(Integer delphiId);

    /**
     * 结束德尔菲问卷
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    Integer endDelphi(Integer delphiId);

    /**
     * 开启下一个德尔菲问卷
     * @param delphiId
     * @return
     */
    Integer startDelphi(Integer delphiId);

    /**
     * 查找下一个德尔菲问卷
     * @param delphi
     * @return
     */
    Integer selectNextDelphiId(Delphi delphi);

    /**
     * 查询是否推送到该用户
     * @param account 用户账号
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    Integer selectIsParticipant(String account,Integer delphiId);

    /**
     * 新增用户回答
     * @param choiceIdList 选项编号
     * @param account 用户账号
     * @param delphiId 德尔菲问卷编号
     * @return 回答选项的条数
     */
    Integer insertUserAnswer(List<Integer> choiceIdList,String account,Integer delphiId);

    /**
     * 插入用户德尔菲问卷完成状态
     * @param account 用户账号
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    Integer insertUserDelphi(String account,Integer delphiId);

    /**
     * 查询用户问卷完成状态
     * @param delphiId
     * @return
     */
    List<UserFinishState> selectFinishState(Integer delphiId);

    /**
     * 通过德尔菲问卷编号查询选项信息
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    List<Choice> selectChoiceByDelphiId(Integer delphiId);

    /**
     * 统计选项被选的个数
     * @param delphiId 德尔菲问卷编号
     * @return 统计后的选项集合
     */
    List<Choice> countUserChoice(Integer delphiId);


    /**
     * 通过德尔菲编号查询问卷信息
     * @param delphiId 德尔菲问卷编号
     * @return
     */
    Questionnaire selectQuestionnaireByDelphiId(Integer delphiId);

    /**
     * 插入工具推送人员
     * @param relations 要推送人员的数组
     * @return 受影响的行数
     */
    Integer insertToolUser(List<ToolUserRelation> relations);


    /**
     * 插入工具
     * @param tool 工具信息
     */
    Integer insertTool(Tool tool);

    /**
     * 批量插入工具（创建会议时）
     * @param toolList
     * @return
     */
    Integer insertTools(List<Tool> toolList);

    /**
     * 插入德尔菲
     * @param delphis 德尔菲数组
     * @return 返回受影响的行数
     */
    Integer insertDelphi(List<Delphi> delphis);

    /**
     * 开启工具/开始议题
     * @param toolId
     * @return
     */
    Integer startTool(Integer toolId);

    /**
     * 查找工具的第一个德尔菲问卷编号
     * @param toolId
     * @return
     */
    Integer selectFirstDelphi(Integer toolId);

    /**
     * 开启第一个德尔菲问卷
     * @param toolId
     * @return
     */
    Integer startFirstDelphi(Integer toolId);

    /**
     * 查找前一个议题状态
     * @param toolId
     * @return
     */
    Integer selectPreviousAgendaState(Integer toolId);

    /**
     * 插入会议参会人员
     * @param toolId
     * @param userList
     * @return
     */
    Integer insertParticipants(Integer toolId,List<User> userList);

    /**
     * 查找工具推送人
     * @param toolId
     * @return
     */
    String getToolPusher(Integer toolId);
}
